import os.path

from flask import request
from SQLConfig import app
import constants
from updateProjectFile import changeProjectFile


@app.route('/punctuation', methods=['Get', 'POST'])
def punctuation():  # put application's code here
    """
    接受标点的数据并保存为txt文件
    """
    if request.method=='POST':
        patientId = request.json.get("patientId")
        pointsIn = request.json.get("pointsIn")     # 前端发送一个json一维列表
        pointsAim=request.json.get("pointsAim")     # 前端发送一个json一维列表
        indexIn = request.json.get("indexIn")        # 第一个点云文件的下标
        indexAim = request.json.get("indexAim")       # 第二个点云文件的下标
    elif request.method=='GET':
        patientId = request.args.get("patientId")
        pointsIn = request.args.get("pointsIn")     # 前端发送一个json一维列表
        pointsAim=request.args.get("pointsAim")     # 前端发送一个json一维列表
        indexIn = request.args.get("index1")        # 第一个点云文件的下标
        indexAim = request.args.get("index2")       # 第二个点云文件的下标

    # 将id转化为字符串
    patientId=str(patientId)
    # 通过下标找到stl文件的文件名
    stlFileNameAim=getStlFileName(patientId, indexAim)
    stlFileNameIn=getStlFileName(patientId, indexIn)

    # 通过stl文件名确定应该保存的标点文件的文件名
    pointAim, pointIn = getPuncFilePath(patientId, stlFileNameAim,stlFileNameIn)

    # 若路径不存在，则先创建
    if not os.path.exists(os.path.join(constants.patientBaseUrl, patientId, constants.patientPointsUrl)):
        os.makedirs(os.path.join(constants.patientBaseUrl, patientId, constants.patientPointsUrl))

    # 保存文件
    save(pointIn, list(pointsAim))
    save(pointAim, list(pointsIn))

    # 记录进工程文件
    changeProjectFile(patientId, "points", "insert", 0, {
        "filename":pointIn,
        "from":stlFileNameIn,
        "to":stlFileNameAim
    })
    changeProjectFile(patientId, "points", "insert", 0, {
        "filename":pointIn,
        "from":stlFileNameAim,
        "to":stlFileNameIn
    })
    return "OK"



def save(filename, points):
    content=""
    for i in range(len(points)//3):
        content+=" ".join(map(str,points[3*i:3*i+3]))
        content += "\n"
    fh = open(filename, 'w', encoding='utf-8')
    fh.write(content)
    fh.close()

def getPuncFilePath(patientId, stlFileNameAim, stlFileNameIn):
    pointIn=os.path.join(constants.patientBaseUrl, patientId, constants.patientPointsUrl, "".join([getFileFirstName(stlFileNameAim),getFileFirstName(stlFileNameIn),getFileFirstName(stlFileNameIn),".txt"],))
    pointAim = os.path.join(constants.patientBaseUrl, patientId, constants.patientPointsUrl, "".join([getFileFirstName(stlFileNameAim),getFileFirstName(stlFileNameIn),getFileFirstName(stlFileNameAim),".txt"]))
    return pointAim, pointIn

def getFileFirstName(filename):
    return os.path.splitext(filename)[0]

def getStlFileName(patientId, index):
    return changeProjectFile(patientId, "stlFiles", "select", index, 0)["filename"]